#include "Archivos.h"
#include <iostream>

AdminArchivos::AdminArchivos(char* path)
{
    filename = path;
    file_OK = false;
}



bool AdminArchivos::openFile(int accion)
{
    if(accion == 1)
    {
        file.open(filename,ios::in|ios::out|ios::trunc);
    }
    else
        file.open(filename, ios::in);

    return file_OK = file.good();
}

bool AdminArchivos::closeFile()
{
    file.close();
    return file_OK = file.good();
}

bool AdminArchivos::reset()
{
    file.clear();
    file.seekg(0);
    return file_OK = file.good();
}

bool AdminArchivos::gotoEnd()
{
    file.clear();
    file.seekg(0,ios::end);
    return file_OK = file.good();
}

bool AdminArchivos::seek(long num)
{
    file.clear();
    file.seekg(num);
    return file_OK = file.good();
}

bool AdminArchivos::puedeLeer() const
{
    return file_OK;
}

bool AdminArchivos::writeEnvio(Envios* est)
{
    file<< est->getNumID()<<endl;
    file<< est->getDescripcion()<<endl;
    file<< est->getPeso()<<endl;
    file<< est->getSeguridad()<<endl;
    file<< est->getImpuestos()<<endl;// en porcentajes como 0.10 = 10%
    file<< est->getCliente()<<endl;
    file<<est->getArea()->getPais()<<endl;
    file<<est->getArea()->getCiudad()<<endl;
    file<<est->getArea()->getDireccion()<<endl;
    file<<est->getArea()->getRuta()->getPtoSalida()<<endl;
    file<<est->getArea()->getRuta()->getPtoLlegada()<<endl;
    file<<est->getArea()->getRuta()->getEscalas()<<endl;
    file<<est->getArea()->getRuta()->getKilometros()<<endl;
    file<<est->getArea()->getRuta()->getTransporte()->getMedioSelec()<<endl;

    file.flush();
    return file_OK = file.good();
}

bool AdminArchivos::writeRuta(Ruta* est)
{
    file<<est->getPtoSalida()<<endl;
    file<<est->getPtoLlegada()<<endl;
    file<<est->getEscalas()<<endl;
    file<<est->getKilometros()<<endl;
    file<<est->getTransporte()->getMedioSelec()<<endl;

    file.flush();
    return file_OK = file.good();
}


bool AdminArchivos::writeCliente(Cliente* est)
{
    file<< est->getId()<<endl;
    file<<est->getNombre()<<endl;
    file<< est->getDireccion()<<endl;
    file<< est->getTelefono()<<endl;
    file<< est->getTotalEnviosHechos()<<endl;
    file<< est->getCostosEnvioTotal()<<endl;


    file.flush();
    return file_OK = file.good();
}

Cliente* AdminArchivos::readCliente()
{
    int ID, TotalEnviosHechos, basura1, basura2;
    string Nombre, Direccion, Telefono;
    float CostosEnvioTotal;
    file>>ID;
    file>>Nombre;
    file>>Direccion;
    file>>Telefono;
    file>>basura1;
    file>>basura2;

    Cliente *clie = new Cliente(ID,Nombre, Direccion,Telefono);
    return clie;
}

Ruta* AdminArchivos::readRuta()
{
    string medioSelec;
    file>> medioSelec;
    Transporte *transporte = new Transporte(medioSelec);

    string ptoSalida, ptoLlegada, escalas;
    int kilometros, bas;
    file>> ptoSalida;
    file>> ptoLlegada;
    file>> escalas;
    file>> kilometros;
    file>>bas;
    Ruta *ruta = new Ruta(ptoSalida, ptoLlegada, escalas, kilometros, transporte);
    return ruta;
}



Envios* AdminArchivos::readEnvio()
{
    string numID, Descripcion, cliente;
    float peso, impuestos;
    char seguridad;
    file>> numID;
    file>> Descripcion;
    file>> peso;
    file>> seguridad;
    file>> impuestos;// en porcentajes como 0.10 = 10%
    file>> cliente;


    string Pais, ciudad, direccion;
    file>> Pais;
    file>> ciudad;
    file>> direccion;


    string ptoSalida, ptoLlegada, escalas;
    int kilometros;
    file>> ptoSalida;
    file>> ptoLlegada;
    file>> escalas;
    file>> kilometros;

 string medioSelec;
    file>> medioSelec;

    Transporte *transporte = new Transporte(medioSelec);
    Ruta *ruta = new Ruta(ptoSalida, ptoLlegada, escalas, kilometros, transporte);
    Area* area = new Area(Pais, ciudad, direccion, ruta);
    Envios* envio = new Envios(numID, Descripcion, peso, seguridad, impuestos, cliente, area);

    return envio;
}



bool AdminArchivos::grabarListaCliente(ListaCliente* list)
{
    if(list != NULL && openFile(1))
    {
        list->setActual(list->getPrimero());
        while(list->getActual() != NULL)
        {
            Cliente *est = list->getActual()->getCliente();
            if(writeCliente(est))
                list->setActual(list->getActual()->getSigNodo());
            else return false;
        }
        return true;
    }
    else
    {
        cout<<"La lista esta vacia o no se pudo abrir el archivo\n";
        return false;
    }
}

bool AdminArchivos::grabarVectorRutas(Ruta** list)
{
    if(list != NULL && openFile(1))
    {

        for(int i=0;i<5;i++)
        {
            Ruta* rut = list[i];
            if(!writeRuta(rut))
                return false;
        }
        return true;
    }
    else
    {
        cout<<"La lista esta vacia o no se pudo abrir el archivo\n";
        return false;
    }
}

bool AdminArchivos::grabarListaEnvio(ListaEnvio* list)
{
    if(list != NULL && openFile(1))
    {
        list->setActual(list->getPrimero());
        while(list->getActual() != NULL)
        {
            Envios *est = list->getActual()->getEnvio();
            if(writeEnvio(est)&& file.good())
                list->setActual(list->getActual()->getSigNodo());
            else return false;
        }
        return true;
    }
    else
    {
        cout<<"La lista esta vacia o no se pudo abrir el archivo\n";
        return false;
    }

}

ListaEnvio* AdminArchivos::levantarListaEnvio()
{
    ListaEnvio *list = new ListaEnvio;
    if(openFile(2))
    {
        Envios* est = readEnvio();

        if(est != NULL)
        {
            list->insertarPrimero(est);
            while(!file.eof())
            {
                Envios *est;
                est = readEnvio();
                if(file.good() && est != NULL)
                {
                    list->insertarPrimero(est);
                }
            }
        }
    }
    return list;
}


Ruta** AdminArchivos::levantarVectorRuta()
{
    Ruta** list = new Ruta*[5];
    for(int i=0;i<5;i++)
        list[i] = new Ruta;

    if(openFile(2))
    {
        Ruta* est = readRuta();
        if(est != NULL)
        {
            list[0] = est;
            int cont = 1;
            while(!file.eof())
            {
                Ruta *est;
                est = readRuta();
                if(file.good() && est != NULL)
                {
                    list[cont] = est;
                    if(cont <5)
                        cont++;
                }
            }
        }
    }
    return list;
}


ListaCliente* AdminArchivos::levantarListaCliente()
{
    ListaCliente *list = new ListaCliente;
    if(openFile(2))
    {
        Cliente* est = readCliente();
        if(est != NULL)
        {
            list->insertarPrimero(est);
            //gotoEnd();
            while(!file.eof())
            {
                Cliente *est;
                est = readCliente();
                if(file.good() && est != NULL)
                {
                    list->insertarPrimero(est);
                    //gotoEnd();
                }
            }
        }
    }
    return list;
}
